package utils

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"sort"
	"strings"
)

// 生成 Auth 字段的哈希值
func GenerateAuth(str string) string {
	hash := sha256.New()
	hash.Write([]byte(str))
	return hex.EncodeToString(hash.Sum(nil))
}

// 签名函数
func GenerateSignature(key string, params map[string]string, uri string, method string) string {
	// 按照参数名 ASCII 字典序升序排序
	keys := make([]string, 0, len(params))
	for k := range params {
		keys = append(keys, k)
	}
	sort.Strings(keys)

	// 构造 stringA
	var stringA strings.Builder
	for i, k := range keys {
		if k != "mp_sig" {
			if i > 0 {
				stringA.WriteString("&")
			}
			stringA.WriteString(k)
			stringA.WriteString("=")
			stringA.WriteString(params[k])
		}
	}

	// 拼接 uri 和 method
	stringB := stringA.String() + "&org_loc=" + uri + "&method=" + method

	// 使用 HMAC-SHA256 生成签名
	h := hmac.New(sha256.New, []byte(key))
	h.Write([]byte(stringB))
	sig := hex.EncodeToString(h.Sum(nil))

	return sig
}
